package cn.analysys.test;

import org.activiti.engine.*;
import org.activiti.engine.identity.Group;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import java.util.List;

/**
 *
 * 流程引擎架构
 *      初始化流程引擎
 *      常用类介绍
 */
public class CreateTest1 {


    public static void main(String[] args) {

        // 3种初始化流程配置方式 （主要以配置mysql讲解）
//        initProcessEngine();

        // 介绍常用类
//        explainService();

        // 数据保存于查询
        // saveData();

        // 数据查询
//        listData();

        // demo项目
//        demo();
    }

    /**
     * 3种初始化流程配置方式 （主要以配置mysql讲解）
     */
    public static void initProcessEngine() {
        // 1. 读取默认配置文件
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

        // 2.读取指定配置文件方式
//        ProcessEngine engine =  ProcessEngines
//                .getProcessEngine(CreateTest1.class.getResource("/").getPath() + "/activiti.cfg.xml");

        // 3. 通过引擎配置类
//        ProcessEngineConfiguration processEngineConfiguration =
//                ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
//        processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
//        processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/db_activiti");
//        processEngineConfiguration.setJdbcUsername("root");
//        processEngineConfiguration.setJdbcPassword("123456");
//        processEngineConfiguration.setDatabaseSchema(processEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
//        ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
    }

    /**
     * 介绍常用类
     */
    public static void explainService() {

        // ProcessEngine:定义了各种服务类实例对象方法
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();

        // 提供一系列操作流程定义的方法(存储服务)
        RepositoryService repositoryService = engine.getRepositoryService();
        // 提供一系列操作流程实例的方法(运行时服务)
        RuntimeService runtimeService = engine.getRuntimeService();
        // 提供一系列流程任务的方法，例如：任务的完成、挂起、激活、添加处理人、认领、删除等操作。
        TaskService taskService = engine.getTaskService();
        // 提供一系列操作用户或者用户组的方法。
        IdentityService identityService =  engine.getIdentityService();
        // 提供一系列查询历史流程实例、历史变量、历史任务的方法。
        HistoryService historyService = engine.getHistoryService();
        // 提供查询数据库中的数据、表的元数据以及执行命令等方法。
        ManagementService managementService = engine.getManagementService();
        // 提供一系列操作流程表单的方法
        FormService formService = engine.getFormService();
 }




    /**
     * 保存数据到 act_id_group 表
     */
    public static void saveData() {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        IdentityService identityService = engine.getIdentityService();
        for (int i = 1; i <= 10; i++) {
            Group group = identityService.newGroup(String.valueOf(i));
            group.setName("name_" + i + 1);
            group.setType("type_" + i + 1);
            identityService.saveGroup(group);
        }
    }

    /**
     * 获取数据
     */
    public static void listData() {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        IdentityService identityService = engine.getIdentityService();
        List<Group> list = identityService.createGroupQuery().orderByGroupId().desc().list();
        List<Group> listPage = identityService.createGroupQuery().orderByGroupId().desc().listPage(2, 5);

        Group singleResult = identityService.createGroupQuery().groupId("1").orderByGroupId().desc().singleResult();

        List<Group> listNative = identityService.createNativeGroupQuery().sql("select * from act_id_group where NAME_ like #{name} and TYPE_ = #{type}").parameter("name", "%n%").parameter("type", "type_1").list();

        List<Group> listNative2 = identityService.createNativeGroupQuery().sql("select * from act_id_group where TYPE_ = #{type}").parameter("type", "type_1").list();

        System.out.println();
    }

    /**
     * 流程操作小案例
     */
    public static void demo() {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        //存储服务
        RepositoryService repositoryService = engine.getRepositoryService();
        // 部署流程：将demo.bpmn流程部署
        repositoryService.createDeployment().addClasspathResource("demo.bpmn").deploy();

        // 完成部署后，需要启动流程
        // 运行时服务
        RuntimeService runtimeService = engine.getRuntimeService();
        // 得到流程的实例
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1");

        // 任务服务
        TaskService taskService = engine.getTaskService();
        // 普通员工完成流程
        Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
        System.out.println("当前流程点：" + task.getName());
        // 完成该任务
        taskService.complete(task.getId());

        // 高级员工完成流程
        task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
        System.out.println("当前流程点：" + task.getName());
        taskService.complete(task.getId());

        // 流程结束
        task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
        System.out.println("当前流程点：" + task);

        // 关闭流程引擎
        engine.close();
        System.exit(0);
    }
}
